#include <stdio.h>
#include <stdlib.h>

#include "TParser.h"
#include "funcionesAuxiliares.h"

int abrirProcesarArchivo(char* nombreArchivo){
    /*defino e inicializo las variables para manejar los errores*/
    char mensaje[MAX_DATO];
    int codigo = CODIGO_OK;
    /* Archivo a procesar */
    FILE* archivoProcesar;
    /* Parser que se usa */
    TParser parser;
    /* Abre el archivo a procesar */
    archivoProcesar = fopen(nombreArchivo, "r");
    /* Se crea el parser */
    TParser_Crear(&parser);
    /* Determina si se pudo abrir o no el archivo */
    if (archivoProcesar!=NULL){
        /* Si pudo abrir el archivo lo procesa */

        /* Mientras no se termine el archivo lo muestra linea por linea */
        while(!feof(archivoProcesar)&&(!codigo)){ /*si ya hubo un error deja de procesar el archivo*/
            /* Linea obtenida del archivo */
            char lineaArchivo[MAX_LONGITUD_LINEA];
            /* Posicion linea a procesar */
            int posicionLinea;
            /* Muestra el archivo linea a linea */
            fgets(lineaArchivo, MAX_LONGITUD_LINEA, archivoProcesar);
             /* Recorre caracter por caracter la linea leida */
            for (posicionLinea=0; posicionLinea<MAX_LONGITUD_LINEA && (lineaArchivo[posicionLinea]!=CARACTER_FIN_LINEA) && (lineaArchivo[posicionLinea]!='\0'); posicionLinea++){
                if (TParser_PushChar(&parser, lineaArchivo[posicionLinea])){
                	/*recuperarMensajeError(parser.codigoUltimoError);*/
                	TParser_getUltimoError(&parser, &codigo, mensaje);
                	printf("%s\n",mensaje);
                	TParser_terminarFlujo(&parser);
                	/* Cierra el archivo */
                	fclose(archivoProcesar);
                	return CODIGO_OK;
                }
            }
        }
        TParser_terminarFlujo(&parser);
        /* Cierra el archivo */
        fclose(archivoProcesar);
    }else{
        /* Si no se encontro el archivo devuelve error */
        return CODIGO_ERROR_ARCHIVO_INEXISTENTE;
    }
    /* Si no ocurrio error, retorna ejecucion ok */
    return CODIGO_OK;
}

int main(int argc, char* argv[]){
    /* Determina que la cantidad de argumentos sea la correcta */
    if (argc==CANTIDAD_ARGUMENTOS_NECESARIOS){
        /* Codigo retorno procesado archivo */
        int codigoRetornoProcesadoArchivo = CODIGO_OK;
        /* Procesa el archivo indicado en el argumento */
        codigoRetornoProcesadoArchivo = abrirProcesarArchivo(argv[POSICION_ARGUMENTO_NOMBRE_ARCHIVO]);
        /* Si se produjo error muestra el mensaje correspondiente */
        if (codigoRetornoProcesadoArchivo!=CODIGO_OK){
            printf("%s\n",MENSAJE_ARCHIVO_INEXISTENTE);
        }
    }else{
        /* Muestra mensaje de error indicando que no se
           recibieron la cantidad de argumentos necesarios */
        printf( "%s",MENSAJE_CANTIDAD_ARGUMENTOS_INVALIDA);
    }
    /* Devuelve codigo de ejecucion correcta */
    return CODIGO_OK;
}
